阅读指南
上一节看到了词向量的神奇性质和学习机制。但这背后隐藏着一个更深刻的问题:这些数字真的代表"意义"吗?本节将从哲学角度思考"什么是猫",同时看看一些有趣的词向量实验,最后补充余弦相似度的技术细节。
读到这里,希望停下来思考一个深刻的问题。
"猫"这个词,是什么?
"猫"在不同的系统中,有着完全不同的表示方式:
系统 表示方式 说明
─────────────────────────────────────────────────────────
人类语言 "猫" 汉字符号
英语 "cat" 字母组合
计算机 01101110 01011011 00101100 二进制编码
ChatGPT [0.23, -0.45, 0.67, ..., 0.12] 12288维向量
哪一个才是真正的"猫"?
这个问题,在哲学上被称为指称问题(Problem of Reference)。20世纪的语言学家费尔迪南·德·索绪尔给出了一个深刻的答案:
"词的意义不在符号本身,而在于它与其他词的关系网络。"
真正的"猫",不是某个具体的符号或数字,而是一种关系的集合:
Embedding做的,正是把这个"关系的集合"编码成了数学对象。
在哲学上,这被称为结构主义的观点:一个事物的意义,不在于它本身,而在于它与其他事物的关系网络。Embedding,就是用数学的方式,实现了这个哲学洞见。
这就引出了一个有趣的问题:AI真的"理解"语言吗?从某种意义上说,是的。AI不需要真的"见过"一只猫,也不需要摸过它的毛、听过它的叫声——这些都是人类的感性经验。AI所做的,是在文本中见过数万次"猫"这个词与其他词的共现,然后把这些共现规律编码进Embedding向量里。
这是一种统计意义上的理解。虽然与人类的感性经验不同,但在语言处理上,这种基于关系网络的理解方式惊人地有效。
向量语义加减法有一个更酷的玩法:拿几个词,把它们随意加减,看看会发生什么。
选4个词来做实验:火焰、水、夜晚、白天
1. 火焰 + 水
Embedding(火焰) + Embedding(水) ≈ Embedding(蒸汽 / 云雾 / 温泉)
火焰:热、能量、动态
水:液体、流动、生命
相加:两种元素的融合 → 产生蒸汽、雾气这种介于两者之间的状态
2. 火焰 - 水
Embedding(火焰) - Embedding(水) ≈ Embedding(干燥 / 燃烧 / 沙漠)
火焰 - 水 = 去掉"冷、湿"的属性
保留:热、干燥、炙烤
结果:极度干燥和炽热的状态 → 沙漠、烈日、干旱
3. 夜晚 + 火焰
Embedding(夜晚) + Embedding(火焰) ≈ Embedding(篝火 / 烛光 / 星火)
夜晚:黑暗、神秘、静谧
火焰:光明、温暖、跳动
相加:黑暗中的光明 → 篝火晚会、烛光晚餐的浪漫氛围
4. 夜晚 - 白天
Embedding(夜晚) - Embedding(白天) ≈ Embedding(黑暗 / 阴影 / 月光)
夜晚 - 白天 = 去掉"光明、活跃"的成分
强化:黑暗、安静、神秘
结果:纯粹的黑暗概念,或者月光这种微弱的光
5. 水 + 夜晚
Embedding(水) + Embedding(夜晚) ≈ Embedding(月光下的湖面 / 夜雨 / 深海)
水:流动、平静、反射
夜晚:黑暗、宁静、神秘
相加:宁静而神秘的水域 → 月光下波光粼粼的湖面
6. 白天 + 水
Embedding(白天) + Embedding(水) ≈ Embedding(清晨的露水 / 海滩 / 喷泉)
白天:明亮、活力、清新
水:清澈、流动、生机
相加:明亮而有生机的水景 → 阳光下的海滩、喷泉
7. 火焰 + 夜晚 - 水
Embedding(火焰) + Embedding(夜晚) - Embedding(水) ≈ Embedding(干燥的篝火 / 沙漠之夜的营火)
火焰 + 夜晚 = 黑暗中的火光
再减去水 = 去掉湿润、去掉蒸汽
结果:干燥炙热的夜间火焰 → 沙漠中的营火
8. 白天 - 夜晚
Embedding(白天) - Embedding(夜晚) ≈ Embedding(正午 / 阳光 / 明亮)
白天 - 夜晚 = 去掉所有"黑暗"成分
强化:光明、炙热、耀眼
结果:极致的光明 → 正午的烈日
这是一个关于哲学和科学如何殊途同归的故事。
1916年,瑞士日内瓦
瑞士语言学家费尔迪南·德·索绪尔去世后,他的学生整理出版了《普通语言学教程》。书中提出了一个革命性的观点:
"词的意义不在符号本身,而在于它与其他词的差异关系。"
这是纯粹的哲学思辨,基于对语言本质的深刻洞察。
2013年,美国加州
97年后,Google的工程师Tomas Mikolov和他的团队发明了Word2Vec。他们的目标很实际:如何更高效地让计算机表示词?
他们设计了一个算法:
训练目标:根据上下文预测词
副产品:每个词得到一个12288维向量
惊喜发现:这些向量竟然能做代数运算!
国王 - 男人 + 女人 = 女王
语言学家们震惊了:"这不就是索绪尔说的'关系网络'的数学实现吗?!"
Word2Vec的发明者们并没有读过索绪尔的理论,他们只是在解决工程问题。但他们用数学和数据,独立地"发现"了索绪尔用思辨得出的结论。
哲学的思辨和科学的实验,常常是从不同路径,抵达同一个真理。
当一个数学模型与哲学洞见高度一致时,往往说明我们触及了事物的真实本质。这或许就是为什么,AI研究不仅需要工程师,也需要哲学家。
本节中多次提到"相似度"来衡量两个向量的相似程度,这里用的就是余弦相似度。
简单理解
余弦相似度衡量的是两个向量的方向有多相似,而不是大小。
想象两个箭头:
情况 余弦相似度 说明
──────────────────────────────────────────────
两个箭头指向同一方向 1 完全相同
两个箭头垂直 0 完全无关
两个箭头方向相反 -1 完全相反
数学公式
余弦相似度=A⋅B∣A∣×∣B∣\text{余弦相似度} = \frac{A \cdot B}{|A| \times |B|}
其中:
具体例子
计算"猫"和"狗"的One-Hot向量相似度:
向量 表示 说明
─────────────────────────────────
A [1, 0, 0, 0, 0] "猫"
B [0, 1, 0, 0, 0] "狗"
步1:计算点积
A⋅B=1×0+0×1+0×0+0×0+0×0=0A \cdot B = 1\times0 + 0\times1 + 0\times0 + 0\times0 + 0\times0 = 0
步2:计算长度
∣A∣=12+02+02+02+02=1|A| = \sqrt{1^2 + 0^2 + 0^2 + 0^2 + 0^2} = 1
∣B∣=02+12+02+02+02=1|B| = \sqrt{0^2 + 1^2 + 0^2 + 0^2 + 0^2} = 1
步3:计算余弦相似度
余弦相似度=A⋅B∣A∣×∣B∣=01×1=0\text{余弦相似度} = \frac{A \cdot B}{|A| \times |B|} = \frac{0}{1 \times 1} = 0
结果为0,说明这两个向量完全垂直,没有任何相似性。
为什么叫"余弦"?
因为它实际上计算的是两个向量之间夹角的余弦值:
夹角0° → cos(0°) = 1 (完全相同)
夹角90° → cos(90°) = 0 (垂直,无关)
夹角180° → cos(180°) = -1 (完全相反)
为什么用余弦相似度?
在词向量中,关心的正是词的语义方向是否相似,而不是绝对大小,所以余弦相似度是最合适的度量。
现在知道了Embedding是如何把文字变成向量的:每个词都是一个12288维的向量,编码了它的语义。
但这些向量是哪里来的?它们是怎么学会语义的?
答案就在下一节:预训练——通过3000亿Token的训练,让模型学会语言规律。
| 中文 | English | 音标 | 说明 |
|---|---|---|---|
| 指称问题 | Problem of Reference | /ˈprɒbləm əv ˈrefrəns/ | 符号与它所代表的事物之间关系的哲学问题 |
| 结构主义 | Structuralism | /ˈstrʌktʃərəlɪzəm/ | 认为事物的意义来自其与其他事物的关系而非本身的哲学观点 |
| 向量夹角 | Vector Angle | /ˈvektər ˈæŋɡl/ | 两个向量之间的夹角,余弦相似度即夹角的余弦值 |
| 点积 | Dot Product | /dɒt ˈprɒdʌkt/ | 向量对应位置相乘再相加的运算,用于计算余弦相似度 |
| 向量模长 | Vector Norm | /ˈvektər nɔːm/ | 向量的长度(L2范数),从原点到向量终点的距离 |
| Word2Vec | Word2Vec | /wɜːd tuː vek/ | 2013年Google发布的词向量训练算法,首次展示语义代数性质 |